package com.zb.test;

import com.zb.functionalInterface.Calculate;
import com.zb.functionalInterface.Emp1;
import com.zb.functionalInterface.Emp2;
import com.zb.functionalInterface.Emp3;
import org.junit.Test;

/**
 * 一. Lambda表达式语法基础：Java8中引入一个新的操作符 "->",该操作符成为箭头操作符活Lambda操作符
 *         箭头操作符将Lambda表达式拆分为两部分：
 *          1.左侧：Lambda表达式的参数列表
 *          2.右侧：Lambda表达式中需要执行的的功能，即Lambda体
 * 二. Lambda 表达式需要"函数式接口"的支持
 *      函数式接口：接口中必须只有一个抽象方法的接口，就叫做函数式接口。
 *                可以使用注解@FunctionalInterface修饰，改注解可以检测一个接口是否是函数式接口。
 *
 */
public class JAVA8_1_Lambda {
    //语法1 无参数，无返回值
    @Test
    public void test1(){
        //正常写法
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello World！");
            }
        };
        r.run();

        //Lambda写法
        Runnable r1 = ()-> System.out.println("hello Lambda！");
        r1.run();

    }

    //语法2 有一个参数，无返回值
    @Test
    public void test2(){
        Emp1 e = (x) -> {System.out.println("删除id为"+x+"的数据");};
        e.deleById(1);
        e.deleById(2);
        e.deleById(Integer.parseInt("3"));
        //如果只有一个参数可以不写()
        //如果lambda体只有一条语句可以不写{}
        Emp1 e1 = x -> System.out.println("删除id为"+x+"的数据");
        e.deleById(4);
    }

    //语法3 多个参数，无返回值
    @Test
    public void test3(){

        Emp2 emp2 = (id, name, tem) -> {
            //多听条语句需要{}包裹起来
            System.out.println("id为："+id);
            System.out.println("name为："+name);
            System.out.println("tem为："+tem);
        };
        emp2.deleByCondition(1,"zhangbin",false);
    }

    //语法4 多个参数，有返回值
    @Test
    public void test4(){
        Emp3<Integer> emp3 = (Integer a, Integer b, Integer c) -> {
            return a+b+c;
        };
        System.out.println(emp3.sum(1,2,3));
        //如果Lambda体重只哟一个语句可以省略{}。如果是有返回值且只有一条语句还可以省略return关键字
        //类型腿推断，a b c不用指明类型
        Emp3<Integer> emp3_1 = (a, b, c) -> a+b+c;
        System.out.println(emp3_1.sum(3,4,5));
    }


    //需求：对一个数据进行加减乘除操作
    @Test
    public void test5(){
        int r3 = operate(100, new Calculate() {
            @Override
            public int calculate(int x) {
                return x+2;
            }
        });
        System.out.println(r3);
        //Lambda 表达式写法

        int r1 = operate(100,(x) -> x+x);
        System.out.println(r1);

        int r2 = operate(300,x->300*300-1);
        System.out.println(r2);

    }

    public int operate(int x, Calculate calculate){
        return calculate.calculate(x);
    }

}
